package org.example.aggregation.untils;

import org.example.aggregation.dto.AggregationDto;

import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;

public class AggregationListUtil {

    @SafeVarargs
    public static <N, T extends AggregationDto<N,T>> Collection<T> merge(List<T>... lists){
        if(lists == null){
            return new ArrayList<>();
        }
        //定义一个 map，用来存放合并后的数据
        LinkedHashMap<N, T> nl = new LinkedHashMap<>();

        for(List<T> list : lists){
            //某个 list 为 null，可能发生空指针
            if(list == null){
                continue;
            }
            for(T t : list){
                //某个元素为 null，也需要跳过
                if(t == null){
                    continue;
                }
                //调用方法，来合并元素
                nl.merge(t.uniqueKey(), t, AggregationDto::concat);
            }
        }
        return nl.values();
    }
}
